Модель данных¶
Tarantool Column Store использует табличную модель данных, характерную для большинства СУБД, использующих SQL:
Данные хранятся в таблицах;
Один хранимый объект формирует одну строку таблицы;
Структура таблицы определяется набором ее столбцов – колонок;
Каждая колонка содержит данные одного типа.
Список поддерживаемых типов данных приведен в разделе Типы данных.
Для логической организации таблиц в TCS используется понятие схемы (schema) – именованного пространства хранения таблиц. Каждая таблица может содержаться только в одной схеме. Имена таблиц в разных схемах могут повторяться. Схемы агрегируются в каталоги – аналоги баз данных.
Таким образом, полная иерархия хранения данных в TCS выглядит так:
каталог.схема.таблица
По умолчанию используется каталог tcs и схема public. При модификации
или чтении данных из этой схемы можно использовать только имя таблицы без указания
каталога и схемы. В других случаях для работы с данными нужно указывать полный путь
к таблице в формате <КАТАЛОГ>.<СХЕМА>.<ТАБЛИЦА>.
SELECT * FROM customers -- tcs.public.customers
SELECT * FROM mydb.public.customers -- mydb.public.customers
Описание модели данных¶
Модель данных TCS описывается декларативно в файле формата YAML и является частью конфигурации всего TCS.
Описание модели данных содержит список каталогов, схем, таблиц и колонок, а также ряд параметров хранения.
Модель данных описывается следующей схемой:
tcs:
schema:
<CATALOG_NAME>:
<SCHEMA_NAME>:
<TABLE_NAME>:
...
Здесь tcs и schema – зарезервированные названия блоков, обязательные для использования.
Внутри блока schema описываются в порядке вложенности каталоги, схемы и таблицы.
Их имена могут быть произвольными, например:
tcs:
schema:
db:
public:
...
где:
db– название каталога;public– название схемы.
Для использования схемы по умолчанию (tcs.public), в модели данных укажите
эти названия каталога и схемы:
tcs:
schema:
tcs:
public:
...
Внутри блока tcs также можно указать общие параметры хранения для модели данных:
block_size– размер блока хранения значений колонок. Значение применяется ко всем колонкам. Значение по умолчанию:8192.Примечание
В настоящее время изменение значения
block_sizeне реализовано.default_column_values_limit– максимальное количество хранимых одновременно значений каждой колонки. Более старые значения удаляются автоматически при достижении указанного количества. Это значение может быть переопределено для каждой колонки в отдельности через ее атрибут column_values_limit. По умолчанию ограничение не установлено.
tcs:
block_size: 8192
default_column_values_limit: 200000
schema:
...
Описание таблицы¶
Описание таблицы состоит из двух частей:
настроек таблицы;
описаний колонок таблицы.
Настройки таблицы¶
Настройки таблицы включают в себя один параметр:
engine: memcs
где:
engine– вид буферизации, строчная (движок обработки данныхmemtx) или колоночная (движок обработки данныхmemcs). По умолчанию для таблиц используется строчная буферизация (engine: memtx).
Описания колонок¶
Описания колонок вложены в элемент columns. Для каждой колонки можно задать следующие параметры:
columns:
- name: id
data_type: utf8
column_values_limit: 100000
indexed: true
index_depth: 1000
где:
name(обязательный) - название колонки;data_type(обязательный) – тип данных колонки. Возможные значения приведены в Типы данных.
column_values_limit– максимальное количество хранимых одновременно значений колонки. При вставке значений выше указанного предела последние по порядку вставки значения выселяются (удаляются из базы данных).Если атрибут указан, его значение переопределяет
default_column_values_limitдля конкретной колонки.Колонки могут быть разной длины. Допустим, есть колонки:
Attribute0сcolumn_values_limit = 10000Attribute1сcolumn_values_limit = 1000
Если сделать вставку из 20 тысяч строк:
В колонке
Attribute0будет 10000 значений из последних 10000 вставленных строк.В колонке
Attribute1будет 1000 значений из последних 1000 вставленных строк.
То есть полностью прочитать можно только последнюю 1000 строк.
Важно
При изменении значения
column_values_limitв меньшую сторону может потребоваться удаление большого количества данных. Такое удаление приводит к выделению значительного количества оперативной памяти под временное хранение данных, что негативно сказывается на производительности. Для того чтобы не загружать оперативную память, рекомендуется запускать скриптevict_overflowing_blocks.lua, который корректно удаляет лишние записи и не требует много памяти для временного хранения данных.
indexed– наличие индекса key-value по колонке. Значение по умолчанию:false.
index_depth– глубина индекса, то есть предельное количество проиндексированных записей, по которым может быть выполнен быстрый поиск. Значениеnull(как и не указанный параметрindex_depth) означает, что размер индекса не ограничен.Важно
Нельзя указывать значение
index_depthравное0: это приведет к ошибке при загрузке конфигурации.Для неиндексируемых колонок параметр
index_depthне имеет смысла, его можно не указывать. Но если он указан, то его значение также не должно быть равным0(допустимо значениеnullили больше нуля).
Примечание
При необходимости в SELECT-запросе с выборкой по индексу можно использовать функцию not_indexed() и таким образом получить даже те данные, которые вышли за глубину индексации.
Пример модели данных¶
Ниже приведен пример модели данных, где:
db– каталог;public– схема;users– таблица с колонкамиid,username,is_deleted,created_at.
# tcs.yml
tcs:
block_size: 1024
default_column_values_limit: 20000
schema:
db:
public:
users:
engine: memcs
columns:
- data_type: utf8
index_depth: 10000
column_values_limit: 10000
name: id
indexed: true
- data_type: utf8
column_values_limit: 1000
name: username
- data_type: bool
name: is_deleted
- data_type: ts
name: created_at
Типы данных¶
В TCS используются примитивные типы данных Apache Arrow. Поддерживаются следующие типы:
Тип |
Описание |
|---|---|
|
8-битное знаковое целое |
|
16-битное знаковое целое |
|
32-битное знаковое целое |
|
64-битное знаковое целое |
|
8-битное беззнаковое целое |
|
16-битное беззнаковое целое |
|
32-битное беззнаковое целое |
|
64-битное беззнаковое целое |
|
32-битное с плавающей точкой |
|
64-битное с плавающей точкой |
|
128-битное десятичное число с фиксированной точкой (до 38 значащих цифр) |
|
256-битное десятичное число с фиксированной точкой (до 76 значащих цифр) |
|
логический: |
|
UNIX timestamp в миллисекундах |
|
строка UTF-8 |
Десятичное число с фиксированной точкой¶
Типы данных decimal128 и decimal256 имеют обязательный параметр scale (масштаб), определяющий количество
цифр после десятичной точки. При создании таблиц TCS автоматически приводит указанную точность (precision)
к одному из двух поддерживаемых вариантов:
Любая точность в диапазоне
[1, 38]будет приведена к 38 (decimal128).Любая точность в диапазоне
[39, 76]будет приведена к 76 (decimal256).
Установлены следующие ограничения к масштабу и точности:
Масштаб (
scale) должен быть неотрицательным числом и не может превышать точность (precision).Точность (
precision) должна быть в диапазоне[1, 76].Если у значения дробная часть длиннее масштаба колонки, лишние цифры просто отбрасываются (без округления).
При выполнении инструкции CREATE TABLE для указания типа данных decimal можно
использовать псевдонимы. Псевдоним decimal128(scale) эквивалентен decimal(38, scale).
Псевдоним decimal256(scale) эквивалентен decimal(76, scale). Однако в других контекстах,
например, для приведения типов, используйте полное определение decimal(precision, scale).
При использовании подготовленных выражений явное приведение типов не требуется:
CREATE TABLE table3 (a decimal128(4));
PREPARE filter_le(decimal(38, 4)) AS SELECT * FROM table3 WHERE a <= $1;
EXECUTE filter_le('3.1415');
Загрузка модели¶
Модель данных является частью конфигурации TCS, которая хранится и обновляется
посредством etcd.
Загружать конфигурацию в etcd следует с помощью Ansible Tarantool Enterprise.
Задайте новую схему в инвентаре с конфигурацией системы (например, по ключу
all:children:tcs_storages_r01:vars:tarantool_config_group:roles_cfg:app/aggregator_role:tcs:schema).Вызовите метод
etcd_3_0, чтобы перезагрузить конфигурацию и применить новую схему. При необходимости задайте параметрlimit:docker run --network host -it --rm \ -v ${PATH_TO_PRIVATE_KEY}:/ansible/.ssh/id_private_key:Z \ -v ${PATH_TO_INVENTORY}:/ansible/inventories/hosts.yml:Z \ ansible-tarantool-enterprise:${DEPLOY_TOOL_VERSION_TAG} \ ansible-playbook -i /ansible/inventories/hosts.yml \ playbooks/etcd_3_0.yml --limit ${HOSTS}
Примечание
Данная процедура аналогична той, что приведена в разделе Tarantool 3.0: Отправка конфигурации в etcd в документации по инсталлятору Ansible Tarantool Enterprise.
Изменение модели¶
TCS поддерживает изменение модели во время работы. Вы можете создавать новые каталоги, схемы, таблицы, колонки и индексы. Для изменения модели данных подготовьте инвентарь, включающий новую модель данных, и загрузите его.
Важно
Не поддерживаются следующие действия:
Изменение типа данных в колонках и индексах. Система позволяет загружать схемы с подобными изменениями, но реально они не применяются.
Переименование таблиц, колонок и индексов. Вместо этого можно удалить объект и создать новый с нужным названием. Изменение названия объекта ведет к добавлению нового объекта с указанным именем.
При удалении данных о колонке из схемы таблицы, данные этой колонки удаляются из хранилища.